package com.talang.surfing.batch.executor;

import com.talang.surfing.batch.core.TaskCallback;
import com.talang.surfing.batch.core.TaskProcessor;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;

import java.util.concurrent.Future;

/**
 * AsyncExecutor 是一个异步执行器，能够异步执行提供的任务，并回调指定的回调函数。
 * AsyncExecutor 使用了 Spring 的 @Async 注解，表明其 execute 方法应异步执行。
 * execute 方法接收三个参数：
 * 一个任务，一个任务处理器和一个回调函数。
 * 它首先尝试执行任务处理器的 doTask 方法（如果 doTask 方法抛出异常，execute 方法将抛出 RuntimeException）。
 * 然后，无论 doTask 方法的结果如何，它都会调用回调函数的 doCallBack 方法，并将任务和 doTask 方法的返回值作为参数传递给 doCallBack 方法。
 *
 * @author wangwanbao
 * @Date: 2023/6/18 8:23 PM
 */
@Component
public class AsyncExecutor {

    @Async
    public <T> Future<Boolean> execute(T task, TaskProcessor<T> taskProcessor, TaskCallback<T> taskCallback) {
        Boolean status;
        try {
            status = taskProcessor.doTask(task);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        taskCallback.doCallBack(task, status);
        return new AsyncResult<>(status);
    }

}
